package de.joergviola.mobj.server;

import com.google.appengine.api.datastore.Key;
import com.googlecode.objectify.Objectify;
import com.googlecode.objectify.ObjectifyService;
import com.googlecode.objectify.impl.EntityMetadata;
import com.googlecode.objectify.impl.conv.Converter;
import com.googlecode.objectify.impl.conv.ConverterLoadContext;
import com.googlecode.objectify.impl.conv.ConverterSaveContext;

import de.joergviola.mobj.shared.Persistable;

public class PersistableConverter implements Converter {

	@Override
	public Object forDatastore(Object o, ConverterSaveContext ctx) {
		if (o instanceof Persistable) {
			Objectify ofy = ObjectifyService.begin();
			ofy.put(o);
			EntityMetadata<?> metadata = ObjectifyService.factory()
					.getMetadata(o.getClass());
			Key rawKey = metadata.getRawKey(o);
			return rawKey;
		} else {
			return null;
		}
	}

	@Override
	public Object forPojo(Object value, Class<?> fieldType,
			ConverterLoadContext ctx, Object onPojo) {
		if (Persistable.class.isAssignableFrom(fieldType)
				&& value instanceof com.google.appengine.api.datastore.Key) {
			Key rawKey = (Key) value;
			com.googlecode.objectify.Key<Persistable> key = new com.googlecode.objectify.Key<Persistable>(
					rawKey);
			Objectify ofy = ObjectifyService.begin();
			return ofy.get(key);
		} else {
			return null;
		}
	}
}
